// wifi_provisioning_server.h
#ifndef WIFI_PROVISIONING_SERVER_H
#define WIFI_PROVISIONING_SERVER_H

#include "system/includes.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
    WIFI_PROV_SERVER_STOPPED = 0,
    WIFI_PROV_SERVER_STARTING,
    WIFI_PROV_SERVER_RUNNING,
    WIFI_PROV_SERVER_STOPPING,
    WIFI_PROV_SERVER_ERROR
} wifi_prov_server_state_t;

typedef enum
{
    WIFI_PROV_RESULT_UNKNOWN = 0,
    WIFI_PROV_RESULT_OK,
    WIFI_PROV_RESULT_FAIL,
    WIFI_PROV_RESULT_ABORTED
} wifi_prov_result_t;

typedef struct
{
    u16 port;                 // 默认80
    u32 captive_portal_ip;    // 默认 0xC0A80101 (192.168.1.1)
    u8 auto_start;            // 自动等待AP就绪并自启动（默认1）
    u8 enable_captive_portal; // 启用Captive Portal（默认1）
} wifi_prov_server_config_t;

typedef struct
{
    // 服务器开始运行（socket监听成功后）
    void (*on_server_started)(void);

    // 收到配网信息（交给上层执行连接/保存等动作）
    void (*on_credentials)(const char *ssid, const char *pwd, int save);

    // 配网结束（例如上层判断STA已连接/失败），回调后模块会自停
    void (*on_finished)(wifi_prov_result_t result);

    // 服务器停止（资源释放完成后）
    void (*on_server_stopped)(void);
} wifi_prov_server_callbacks_t;

// 初始化模块（线程安全），建议开机调用一次
int wifi_provisioning_server_init(const wifi_prov_server_config_t *cfg);

// 设置回调（可选）
int wifi_provisioning_server_set_callbacks(const wifi_prov_server_callbacks_t *cbs);

// 开启/关闭自启动（默认开启）：开机后内部线程等待AP就绪再启动
int wifi_provisioning_server_enable_autostart(int enable);

// 异步启动（内部用线程启动，避免在回调/中断上下文直接启动）
int wifi_provisioning_server_start_async(void);

// 异步停止（内部用线程停止）
int wifi_provisioning_server_stop_async(void);

// 获取状态
wifi_prov_server_state_t wifi_provisioning_server_get_state(void);

// 上层在“配网完成/失败”后调用，模块回调 on_finished 并自停
int wifi_provisioning_server_notify_finished(wifi_prov_result_t result);

// 反初始化（会尝试先停服）
void wifi_provisioning_server_deinit(void);

// 弱符号：等待AP就绪（可在工程里提供强实现以接入更准确的事件）
__attribute__((weak)) int wifi_prov_wait_ap_ready(void);

#ifdef __cplusplus
}
#endif
#endif